package com.etsii.android.servidor;

import com.etsii.android.servidor.Semaforo.*;

// Clase Monitor SX implementada mediante Semaforos FIFO
// Metodos: lock, locksx, unlock, unlocksx, setsx, Wait y Signal
// Fecha: Noviembre 2005

// Utilizamos Sem_Fifo.java y cond.java 

public class monitor_sx {
  private Semaforo mut;
  private Semaforo sx;
  private boolean assign;

  // Constructor
  public monitor_sx() {
    mut = new Semaforo(1);
    sx = new Semaforo(0);
    setsx(false);
  } // Constructor

  public void lock() { mut.Wait(); }

  public void locksx() { sx.Wait(); }

  public void unlock() { 
    if (assign == false) 
      mut.Signal();
    else { 
      setsx(false); 
      unlocksx(); 
    } // else
  } // unlock

  public void unlocksx() { sx.Signal(); }

  public void setsx(boolean val) { assign = val; }

  // Operacion Wait
  public void Wait(cond_sx c) { c.Wait(); }

  // Operacion Signal
  public void Signal(cond_sx c) { c.Signal(); }
} // monitor
